import {
  IParameter, IDefinitionProperty
} from '../interfaces';

export class SwaggerTools {
  public static REF_STR: string = '#/definitions/';

  /**
   * 获取参数类型
   * 
   * @param parameter 
   */
  public static getParameterType(parameter: IParameter | any): string {
    if (parameter.type) { return parameter.type; }
    if (parameter.schema) {
      if (parameter.schema.$ref) { return SwaggerTools.trimRefStr(parameter.schema.$ref); }
      if (parameter.schema.$reftype) { return parameter.schema.type; }
    }
    return '';
  }

  /**
   * 是否有模型关联
   * 
   * @param parameter 
   */
  public static hasRefByParameter(parameter: IParameter | any): boolean {
    return parameter.schema
      && parameter.schema.$ref
      && SwaggerTools.isRef(parameter.schema.$ref);
  }

  /**
   * 获取属性类型
   * 
   * @param obj 
   */
  public static getDefinitionPropertyType(obj: IDefinitionProperty): string {
    if (obj.$ref) { return SwaggerTools.trimRefStr(obj.$ref); }
    if (obj.type === 'array') {
      return SwaggerTools.getDefinitionPropertyType(obj.items);
    }
    return obj.type;
  }

  /**
   * 属性本身是一个模型
   * 
   * @param obj 
   */
  public static hasRefByDefinitionProperty(obj: IDefinitionProperty): boolean {
    if (obj.$ref) { return true; }
    if (obj.type === 'array') {
      return SwaggerTools.hasRefByDefinitionProperty(obj.items);
    }
    return false;
  }

  /**
   * 是否关联模型
   * 
   * @static
   * @param {string} ref 
   * @returns {boolean} 
   * @memberof SwaggerTools
   */
  public static isRef(ref: string): boolean {
    return ref.indexOf(SwaggerTools.REF_STR) === 0;
  }

  /**
   * 去掉关联对象前缀
   * 
   * @param ref 
   */
  public static trimRefStr(ref: string): string {
    return ref.replace(SwaggerTools.REF_STR, '');
  }

  /**
   * 
   * @param obj 
   */
  public static toArray(obj: any) {
    let keys = [];
    for (const key in obj) {
      keys.push(Object.assign({ key: key }, obj[key]));
    }
    return keys;
  }
}